Python学习笔记:numpy选择符合条件数据:select、where、choose、nonzero 您所在的位置:网站首页 python array取值 Python学习笔记:numpy选择符合条件数据:select、where、choose、nonzero

Python学习笔记:numpy选择符合条件数据:select、where、choose、nonzero

2024-07-16 02:21| 来源: 网络整理| 查看: 265

一、np.select函数 1.介绍

np.select 函数根据某些条件筛选某些元素。

使用语法为:

import numpy as np np.select(condlist, choicelist, default=0) # 返回列表

参数(必须写成“列表”的形式):

condlist -- 操作数据所依据的条件 choiselist -- 根据condlist条件所需要执行的操作 default -- 不满足条件所执行的操作 2.传统循环方法

使用循环、条件判断的方法执行效率低下,可用 select 替代完成。

a = np.array([1,2,3,4,5,6,7,8,9,10]) result = [] for i in a: if i < 6: i += 10 else: i = 100 result.append(i) print(result) # [11, 12, 13, 14, 15, 100, 100, 100, 100, 100] 3.单条件 a = np.array([1,2,3,4,5,6,7,8,9,10]) result2 = np.select([a < 6], [a + 10], default=100) print(result2) # array([ 11, 12, 13, 14, 15, 100, 100, 100, 100, 100])

对应元素满足条件执行操作,否则返回默认值。

4.多条件、多操作 a = np.array([[1,2,3,4,5], [6,7,8,9,10], [11,12,13,14,15], [16,17,18,19,20], [21,22,23,24,25]]) b = np.array(range(25)).reshape(5,5) + 1 result2 = np.select([a10, a20], [a+10, a**2, a*10], default=100) result2 ''' array([[ 11, 12, 13, 14, 15], [100, 100, 100, 100, 100], [121, 144, 169, 196, 225], [100, 100, 100, 100, 100], [210, 220, 230, 240, 250]]) '''

每个条件中,对应为真才执行相应的操作,针对所有条件都不满足元素,执行默认值default。

# 同时满足 result3 = np.select([a10, a20], [a+10, a**2, a*10], default=100) result3 # 观察元素11 ''' array([[ 11, 12, 13, 14, 15], [ 16, 17, 18, 19, 20], [ 21, 144, 169, 196, 225], [100, 100, 100, 100, 100], [210, 220, 230, 240, 250]]) '''

同时满足多个条件下,优先执行条件一、条件二,依次选择。

二、np.where函数 1.介绍

np.where 函数实现满足条件,输出x,不满足条件输出y。

使用语法为:

np.where(condition, x, y) 2.提供3个参数

如果全部数组都是一维数组,则等价于:

[xv if c else yv for c, xv, yv in zip(condition, x, y)]

一维数组实例

a = np.arange(10) # array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9]) np.where(a, 1, -1) # array([-1, 1, 1, 1, 1, 1, 1, 1, 1, 1]) np.where(a > 5, a, a*10) # array([ 0, 10, 20, 30, 40, 50, 6, 7, 8, 9])

多维数组同样可以使用,取满足条件的对应元素。

condition = [[True, False], [True, True]] x = [[1, 2], [3, 4]] y = [[9, 8], [7, 6]] np.where(condition, x, y) ''' array([[1, 8], [3, 4]]) ''' 3.仅有condition参数

缺失x和y参数的情况下,则输出满足条件(非0)元素的坐标,等价于 np.asarray(condition).nonzero() 。

# 广播机制 broadcast a = np.array([2,4,6,8,10]) np.where(a > 5) # (array([2, 3, 4], dtype=int64),) a[np.where(a > 5)] # array([ 6, 8, 10])

多维数组

a = np.arange(27).reshape(3,3,3) ''' array([[[ 0, 1, 2], [ 3, 4, 5], [ 6, 7, 8]], [[ 9, 10, 11], [12, 13, 14], [15, 16, 17]], [[18, 19, 20], [21, 22, 23], [24, 25, 26]]]) ''' np.where(a > 5 ) ''' (array([0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2], dtype=int64), array([2, 2, 2, 0, 0, 0, 1, 1, 1, 2, 2, 2, 0, 0, 0, 1, 1, 1, 2, 2, 2], dtype=int64), array([0, 1, 2, 0, 1, 2, 0, 1, 2, 0, 1, 2, 0, 1, 2, 0, 1, 2, 0, 1, 2], dtype=int64)) ''' a[np.where(a >5)] # array([ 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26])

np.where 输出每个元素对应的坐标,原始数据是三维数组,则输出3个数组的tuple。

三、np.choose函数 1.介绍

同样的,np.choose 实现根据条件选择相关元素,相比较 for if else 执行效率更高。

使用语法:

np.choose(a, choices, out=None, mode='raise')

参数:

a -- int类型数组 0~(n-1)之间的数 choices -- 被操作的数组 与a同维度 out -- 可选 接收运算结果的数组 mode -- 默认raise 表示数组元素不能超过n clip 元素小于0 变为0 大于n-1 变为n-1 wrap value mode n 余数 2.实操 当a和choices相同维数(1维) result = np.array([0,0,0,0,0]) a = np.choose([4,2,1,3,0], [11,22,33,44,55], out=result) print(a) # array([55, 33, 22, 44, 11]) print(result) # array([55, 33, 22, 44, 11])

元素个数代表的是 choices 中的索引 index。

当a和choices相同维数(2维) d = np.choose([[4,2,1,3,0],[3,4,2,0,1],[0,2,1,4,3]], [[11,22,33,32,31],[44,55,66,65,64],[77,88,99,98,97],[111,222,333,332,331],[444,555,666,665,664]]) print(d) ''' [[444 88 66 332 31] [111 555 99 32 64] [ 11 88 66 665 331]] '''

内外层索引匹配。

当a的维数多于choices时 b = np.choose([[4,2,1,3,0],[3,4,2,0,1],[0,2,1,4,3]],[11,22,33,44,55]) print(b) ''' [[55 33 22 44 11] [44 55 33 11 22] [11 33 22 55 44]] ''' 当a的维数少于choices时 c = np.choose([4,2,1,3,0], [[11,22,33,32,31],[44,55,66,65,64],[77,88,99,98,97],[111,222,333,332,331],[444,555,666,665,664]]) print(c) # [444 88 66 332 31]

choices 最外层索引index与a匹配,内层索引默认从0开始,0、1、2、3、4、5逐渐递增的。

鉴于此,choices的内层元素数量依然要与a的个数进行匹配才行,否则会报错。

四、np.nonzero函数

np.nonzero 函数用于得到数组中非零元素的位置(数组索引)。

返回的索引值数组是一个2维tuple数组,该tuple数组中包含一维的array数组。

x = np.array([[3, 0, 0], [0, 4, 0], [5, 6, 0]]) print(x) np.nonzero(x) # (array([0, 1, 2, 2], dtype=int64), array([0, 1, 0, 1], dtype=int64)) x[np.nonzero(x)] # array([3, 4, 5, 6]) a = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]]) np.nonzero(a > 3) ''' (array([1, 1, 1, 2, 2, 2], dtype=int64), array([0, 1, 2, 0, 1, 2], dtype=int64)) '''

参考链接:numpy高级函数操作之——select、choose

参考链接:numpy.select

参考链接:numpy.where() 用法详解

参考链接:numpy.where

参考链接:numpy.nonzero



【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有